package andy.demo.parseXML.xml;

import java.util.ArrayList;
import java.util.List;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;



/**
 * 继承DefaultHandler类
 * 用于解析XML文档的解析类
 * @author Administrator
 *
 * 2010-6-28 下午07:51:20
 */
public class XmlParser extends DefaultHandler{

	//此处将XML里的数据封装成Person类，personList用于装解析后的数据
	private List<Person> personList = new ArrayList<Person>();
	//定义一个Person引用
	private Person person = null;
	//定义一个标记变量，标记当前的Xml文件被解析到哪个标签
	private String currentTag = null;
	
	/**
	 * 返回解析后的数据，是一个对象数组
	 * @return
	 */
	public List<Person> getObjectListFromXML() {
		return personList;
	}
	
	
	/**
	 * 解析XML时，当开始读到一个元素标签开始时，执行下面方法
	 */
	@Override
	public void startElement(String uri, String localName, String name, Attributes attributes) throws SAXException {
		//判断标签名是否为person，是的话创建一个Person对象，并将其id属性拿出来，赋值到person对象中
		if("person".equals(localName)) {
			person = new Person();
			Integer id = new Integer(attributes.getValue(0));
			person.setId(id);
		}
		//标记当前标签名
		currentTag = localName;
	}

	/**
	 * 解析XML时，当开始读到一个文本元素时，执行下面方法
	 */
	@Override
	public void characters(char[] ch, int start, int length) throws SAXException {
		
		//判断此文本元素是在一个 有效的标签体里面的     例：正确：<name>文本元素</name>  错误： 文本元素<name></name>
		
		if(currentTag != null) {
			//如果此文本元素为有效，则得到它的内容
			String value = new String(ch, start, length);
			
			//如果是在name标签里，则赋值给person的name属性
			if("name".endsWith(currentTag)) {
				person.setName(value);
			}
			
			//如果是在age标签里，则赋值给person的age属性
			if("age".endsWith(currentTag)) {
				person.setAge(new Short(value));
			}
		}
	}


	/**
	 * 解析XML时，当读到结束一个元素标签时，执行下面方法
	 */
	@Override
	public void endElement(String uri, String localName, String name) throws SAXException {
		
		//将当前标签名制空
		currentTag = null;
		
		//如果当前结束的标签名是person的话，代表一个person对象已经读取完毕。将其添加到list后制空
		if("person".endsWith(localName)) {
			personList.add(person);
			person = null;
		}
	}
		
	
}